'use strict';

// 导入uni-id-common模块
const uniID = require('uni-id-common');
const db = uniCloud.database();
const dbCmd = db.command;

/**
 * 微信登录云函数
 * @param {Object} event 客户端传入的参数
 * @param {String} event.code 微信登录获取的code
 * @param {Object} context 上下文信息
 */
exports.main = async (event, context) => {
  const { code } = event;
  
  // 初始化uniID实例，显式传入配置
  const uniIDIns = uniID.createInstance({
    context,
    config: {
      tokenSecret: "your-token-secret",
      tokenExpiresIn: 7200
    }
  });
  
  // 微信小程序配置（从config.json中获取实际值）
  const appid = 'wx59ebd5ee8adaaa55';
  const appsecret = '4d68f17bea02434abb7def50e034d8ee';
  
  // 校验参数
  if (!code) {
    return {
      code: 1,
      message: '缺少必要参数code'
    };
  }
  
  if (!appid || !appsecret) {
    return {
      code: 1,
      message: '微信配置不完整，请检查appid和appsecret'
    };
  }
  
  try {
    // 调用微信登录接口
    const loginRes = await uniCloud.httpclient.request(
      `https://api.weixin.qq.com/sns/jscode2session?appid=${appid}&secret=${appsecret}&js_code=${code}&grant_type=authorization_code`,
      {
        method: 'GET',
        dataType: 'json'
      }
    );
    
    // 检查请求是否成功
    if (loginRes.status !== 200) {
      return {
        code: 1,
        message: '微信服务器请求失败',
        data: loginRes
      };
    }
    
    const { openid, session_key, unionid } = loginRes.data;
    
    // 检查是否获取到openid
    if (!openid) {
      return {
        code: 1,
        message: '获取openid失败',
        data: loginRes.data
      };
    }
    
    // 查询用户是否已存在
    const userCollection = db.collection('uni-id-users');
    const userRes = await userCollection.where({
      wx_openid: openid
    }).get();
    
    let userInfo;
    let userId;
    
    if (userRes.data.length === 0) {
      // 用户不存在，创建新用户
      const userData = {
        wx_openid: openid,
        wx_unionid: unionid,
        register_date: Date.now(),
        register_ip: context.CLIENTIP,
        status: 0, // 正常状态
        avatar: '' // 初始头像为空
      };
      
      const addRes = await userCollection.add(userData);
      userId = addRes.id;
      
      // 查询新创建的用户
      const newUserRes = await userCollection.doc(userId).get();
      userInfo = newUserRes.data;
    } else {
      // 用户已存在，更新最后登录时间和IP
      userId = userRes.data[0]._id;
      userInfo = userRes.data[0];
      
      await userCollection.doc(userId).update({
        last_login_date: Date.now(),
        last_login_ip: context.CLIENTIP
      });
    }
    
    // 生成token
    const tokenRes = await uniIDIns.createToken({
      uid: userId
    });
    
    // 检查token生成是否成功
    if (tokenRes.code) {
      return {
        code: tokenRes.code,
        message: tokenRes.errMsg || '生成token失败'
      };
    }
    
    return {
      code: 0,
      message: '登录成功',
      token: tokenRes.token,
      tokenExpired: tokenRes.tokenExpired,
      userId: userId,
      userInfo: {
        // 构建一个安全的用户信息对象，确保所有需要的字段都有默认值
        userId: userId,
        wx_openid: userInfo.wx_openid,
        // 确保gender字段有默认值
        gender: userInfo.gender || 0,
        birthYear: userInfo.birthYear || '',
        address: userInfo.address || '',
        nickname: userInfo.nickname || '',
        avatar: userInfo.avatar || '',
        register_date: userInfo.register_date,
        last_login_date: userInfo.last_login_date
      }
    };
  } catch (error) {
    console.error('微信登录失败:', error);
    return {
      code: 1,
      message: '登录失败',
      data: error.message
    };
  }
};